<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        //利用构造函数来创建对象
        //1、实例成员就是构造函数内部通过this添加的成员
        //实例成员只能通过实例化的对象来访问

        //2、静态成员  在构造函数本身上添加的成员
        function Star(uname,age){
            this.uname=uname;
            this.age=age;
            // this.sing=function(){
            //     console.log('我会唱歌');
            // }
        }
        //添加静态成员
        Star.sex='男'
        //在构造函数的原型对象上定义方法，使得各个实例化对象调用相同方法时指向同一个空间
        //公共的方法都放在原型对象上
        // Star.prototype.sing=function(){
        //     console.log('我会唱歌');
        // }

        //利用对象的方法添加原型方法
        //原型对象函数里面的this指向的是实例对象
        Star.prototype={
            constructor:Star,
            sing:function(){
                console.log('我会唱歌');
            },
            movie:function(){
                console.log('我会演电影');
            }
        }
        //静态成员只能通过构造函数来访问
        console.log(Star.sex);
        

        var ldh=new Star('刘德华',18)
        ldh.sing()
        //对象之所以能访问原型对象 是因为对象具有__proto__属性，指向原型对象
        console.log(ldh);
        console.log(ldh.__proto__==Star.prototype);//两者等价
        //方法的查找规则
        //首先看实例化对象身上是否a有这个方法，否则访问原型查找是否有对应方法

        //构造函数内的原型对象的原型是Object的原型
        console.log(Star.prototype.__proto__==Object.prototype);
        //Object的原型对象的原型为null
        console.log(Object.prototype.__proto__);
        
        
    </script>
</body>
</html>